package com.om.refactoring;

public class RateCalculator {
	#include "RateCalculator.hpp"
	#include "Customer.hpp"
	#include "Site.hpp"

	bool RateCalculator::isWinter() {
		return false;
	}

	int RateCalculator::calculateSlidingScale(int kwh) {
		return kwh;
	}

	int RateCalculator::calculateTerritory(int address) {
		return address;
	}

	double RateCalculator::calculateRate(Customer &c) {
		double rate = 0;
		switch(c.type) {
			case consumer:
				switch(c.rate) {
				case lifeline:
					if(c.kwh <= 100) {
						rate = c.kwh * .03;
						break;
					}
					 else if(c.kwh <= 200) {
						rate = 3+(c.kwh - 100) *.05;
						break;
					}
					// Customer does not qualify for lifline, 
					// fall through to territorial case. 
				case territorial:
					switch(calculateTerritory(c.address)) {
					case 1:
						// spec says territory 1 and 2 use same rate. 
					case 2:
						rate = c.kwh *(isWinter() ? .07 : .06);
						break;
					case 3:
						rate = c.kwh * .065;
						break;
					}
					break;
				}
				break; // consumer 
			case business:
			case industrial:
				for(Customer::c_site::iterator i = c.sites.begin(); i != c.sites.end(); ++i) {
					Site *s =  *i;
					rate += calculateSlidingScale(s->kwh);
				}
				if(c.type == industrial) {
					switch(c.industrialRate) {
					case interruptable:
						rate *= .8;
						break;
					case oneHourNotice:
						rate *= .9;
						break;
					default:
						rate *= .95;
						break;
					}
				}
				// industrial rate 
				break; // business + industrial
		} // customer.type 
		return rate;
	}

}
